package com.wangyf.thread.c_004_volatile;

import java.util.concurrent.TimeUnit;

/**
 * 双重锁校验，Double Check Lock
 * 使用懒汉式单例模式
 * @author wangyf
 * @date 2021/1/2 10:31
 * 其实正常条件下，测试不出来，只能是超高并发下，可能有这个问题。或者用ASM，ASM可以直接操作二进制码，在指令中间睡一会
 */
public class TT {
    // 方法为static 这里也只能static
    private /*volatile*/ static TT t ;
    // 私有化构造方法
    private TT() {}

    // 使用类.方法调用 所以直接static
    public static TT getInstance() {
        if (t == null) {
            synchronized (TT.class) {
                try {// 这1毫秒睡眠相当于其他逻辑代码耗时
                    TimeUnit.MILLISECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (t == null) {
                    t = new TT();
                }
            }
        }
        return t;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                TT t = TT.getInstance();
                System.out.println(t.hashCode());
            }).start();
        }
    }
}
